<?php

/**
 * linruiyan@2013年3月14日 通行证
 */

class PassportApi extends ApiBase{

	
	/**
	 * 构造函数，初始化插件
	 */
	public function __construct() {
		parent::__construct();
	}

	public function dologin($ppid){
		$ppInfo = $this->get($ppid);
		if(empty($ppInfo)){
			throw new PException("用户不存在");
		}
		$_SESSION['ppid'] = $ppInfo['id'];
		$_SESSION['uname'] = $ppInfo['uname'];
		$_SESSION['nickname'] = $ppInfo['nickname'];
		$_SESSION['avartar'] = $ppInfo['avartar_nfile_id'];
		// $_SESSION['private'] = n_api("rbac")->getUserPrivate($_SESSION['ppid']);
		
		//如果ppid小于保留账号100.那么自动赋予管理员权限
		if($_SESSION['ppid']<100){
			$_SESSION['private']['top'][99999] = 'admin-admin';
		}


		$data['ppid'] = $ppInfo['id'];
		$data['login_time'] = time();
		// $data['ip'] = n_api("common")->getClientIp();
		n_api('mysql')->cname('weixin')->insert('passport_log', $data);
		return true;
	}
	public function startSession(){
		if('cgi'==N_SCRIPT){
			n_api('session')->start();
			if(!empty($_SESSION['ppid'])){
				define('N_PPID', $_SESSION['ppid']);
		}
		}
	}
	
	
	/**
	 * 通过用户的ID获取用户信息
	 */
	public function get($id){
		$mysql = n_api("mysql")->cname('weixin');
		if(is_array($id)){
			$idStr = implode("','", $id);
			return $mysql->selectIndex("select * from passport_main where id in('{$idStr}')");
		}else{
			return $mysql->get("passport_main",intval($id));
		}
	}
	public function initAvartar($ppid,$imgpath=''){
		$ppInfo = $this->get($ppid);
		if(empty($ppInfo)){
			throw new PException("找不到用户");
		}
		if(empty($imgpath)){
			$imgpath = N_PLUGINS . "/passport/img/avartar.png";
			$type = 'copy';
		}
		$frs = n_api("nfile")->save($imgpath,"头像","png","",$type);
		n_api("mysql")->cname('weixin')->update("passport_main",array("avartar_nfile_id"=>$frs['id']),"id={$ppid}");
		return TRUE;
	}
	
	public function avatar($ppid){
		
		n_api("nfile")->img();
	}
	
	/**
	 * 通过邮箱来获取用户的信息
	 */
	public function getByEmail($email){
		$email = addslashes($email);
		return n_api('mysql')->cname('weixin')->fetchFirst("select * from passport_main where email='{$email}'");
	}

	/**
	 * 通过名称来获取用户的信息
	 */
	public function getByUname($uname){
		$uname = addslashes($uname);
		return n_api('mysql')->cname('weixin')->fetchFirst("select * from passport_main where uname='{$uname}'");
	}


	public function getSkey($id){
		$ppInfo = n_api("mysql")->cname('weixin')->get('passport_main',$id);
		return $ppInfo['skey'];
	}
	public function getnickname($id){
		$ppInfo = n_api("mysql")->cname('weixin')->get('passport_main',$id);
		return empty($ppInfo['nickname'])?$ppInfo['uname']:$ppInfo['nickname'];		
	}

	/**
	 * 是否已被注册
	 */
	public function isReged($uname){
		$mysql = n_api("mysql")->cname('weixin');
		if($mysql->isExists("select id from passport_main where uname='{$uname}'")){
			return false;
		}
		return true;
	}

	/**
	 * 是否已被注册
	 */
	public function isMphoneReged($mphone){
		$mysql = n_api("mysql")->cname('weixin');
		if($mysql->isExists("select id from passport_main where mphone='{$mphone}'")){
			return false;
		}
		return true;
	}


	public function add($uname,$pwd,$usertype,$ip){
		$mysql = n_api("mysql")->cname('weixin');

		$data['uname'] = $uname;
		$data['nickname'] = $uname;
		$data['password'] = $pwd;
		$data['usertype'] = $usertype;
		$data['regtime'] = time();
		$data['ip'] = ip2long($ip);

		if(!$this->isReged($uname)){
			throw new PException("账号已被注册");
		}
		while(true){
			$data['skey'] = substr(md5(microtime(true)),0,8);
			if(!$mysql->isExists("select id from passport_main where skey='{$data['skey']}'")){
				break;
			}
		}
		
		$ppid = $mysql->insert("passport_main",$data);
		
		//linruiyan@2013年4月2日 
		//方案1：在注册完成后调用member进行初始化。
		//问题：加入了member的处理，意味着他们有耦合了。如果失去member，passport将无法生存。member成为了标配.这不是一个好的方式
		//方案2：如果反过来，一旦获取用户信息发现未有passport的同步信息，那么就去调用passport的信息，并自动插入
		//问题：member将不知道自己应该有多少的用户信息需要保存，只有在未知人出现时，才有可能得到该用户的信息
		//方案3：在方案1的基础上，member成为了一个底层的插件，实现了基本的数据存储的功能。更多的业务将分散到其他插件去实现
		//n_api("member")->init($ppid,$email,'',date('Y-m-d H:i:s'));
		return $ppid;
		
	}

	/**
	 * 添加一个新用户。
	 */
	public function addEmail($email,$pwd,$ip){
		$mysql = n_api("mysql")->cname('weixin');

		$data['email'] = $email;
		$data['uname'] = $email;
		$data['password'] = $pwd;
		$data['regtime'] = time();
		$data['ip'] = ip2long($ip);

		if(!$this->isEmailReged($email)){
			throw new PException("账号已被注册");
		}
		while(true){
			$data['skey'] = substr(md5(microtime(true)),0,8);
			if(!$mysql->isExists("select id from passport_main where skey='{$data['skey']}'")){
				break;
			}
		}
		
		$ppid = $mysql->insert("passport_main",$data);
		
		//linruiyan@2013年4月2日 
		//方案1：在注册完成后调用member进行初始化。
		//问题：加入了member的处理，意味着他们有耦合了。如果失去member，passport将无法生存。member成为了标配.这不是一个好的方式
		//方案2：如果反过来，一旦获取用户信息发现未有passport的同步信息，那么就去调用passport的信息，并自动插入
		//问题：member将不知道自己应该有多少的用户信息需要保存，只有在未知人出现时，才有可能得到该用户的信息
		//方案3：在方案1的基础上，member成为了一个底层的插件，实现了基本的数据存储的功能。更多的业务将分散到其他插件去实现
		n_api("member")->init($ppid,$email,'',date('Y-m-d H:i:s'));
		return $ppid;
	}



	/**
	 * 添加一个新用户。
	 */
	public function addMphone($mphone,$pwd,$ip){
		$mysql = n_api("mysql")->cname('weixin');

		$data['mphone'] = $mphone;
		$data['uname'] = $mphone;
		$data['password'] = $pwd;
		$data['regtype'] = 1;
		$data['regtime'] = time();
		$data['ip'] = ip2long($ip);
		
		if(!$this->isMphoneReged($mphone)){
			throw new PException("该手机已被注册");
		}
		while(true){
			$data['skey'] = substr(md5(microtime(true)),0,8);
			if(!$mysql->isExists("select id from passport_main where skey='{$data['skey']}'")){
				break;
			}
		}
		
		$ppid = $mysql->insert("passport_main",$data);
		
		//linruiyan@2013年4月2日 
		//方案1：在注册完成后调用member进行初始化。
		//问题：加入了member的处理，意味着他们有耦合了。如果失去member，passport将无法生存。member成为了标配.这不是一个好的方式
		//方案2：如果反过来，一旦获取用户信息发现未有passport的同步信息，那么就去调用passport的信息，并自动插入
		//问题：member将不知道自己应该有多少的用户信息需要保存，只有在未知人出现时，才有可能得到该用户的信息
		//方案3：在方案1的基础上，member成为了一个底层的插件，实现了基本的数据存储的功能。更多的业务将分散到其他插件去实现
		n_api("member")->init($ppid,'',$mphone,date('Y-m-d H:i:s'));
		return $ppid;
	}


	
	public function isLogin(){
		if(empty($_SESSION['ppid'])){
			return false;
		}else{
			if(isset($_SESSION['referer'])){
				unset($_SESSION['referer']);
			}
			return true;
		}
	}
	
	/**
	 * 判断用户是否在线
	 */
	public function isOnline($id){
		$conf = n_api('nconfig')->getByPlugins('passport','cache_online','cache_key');
		if('Y'==$po['cache_online']){
			$onlineCache = n_api("redis")->c001->hmGetElment($conf['cache_key'],array($id));
			$rs = empty($onlineCache[$id])?false:true;
		}else{
			$uinfo = $this->get($id);
			return 'N'==$uinfo['isonline']?false:true;
		}
		
	}

	public function isadmin($ppid){
		return 1 == $ppid ? true : false;
	}

	public function isSuperAdmin(){
		$ppid = $_SESSION['ppid'];
		return 1 == $ppid ? true : false;
	}
	
	
	public function getOnlineLog($uid){
		$uid = intval($uid);
		return n_api("mysql")->cname('weixin')->select("select * from passport_log where uid={$uid} order by id desc limit 10");
	}


	public function regNum($ip){
		
		$ip = ip2long($ip);
		$mysql = n_api("mysql")->cname('weixin');
		$ytime = N_NOW - 24*60*60;
		$regNum = $mysql->fetchFirst("select count(*) as total from passport_main where regtime>{$ytime} and ip={$ip}");
		return $regNum['total'];
	}	
	
	
	public function getBetweenId($start,$end){

		return n_api("mysql")->cname('weixin')->select("select * from passport_main where id between {$start} and {$end}");		
	}

	public function getLastLogin($ppid)
	{
		$query = "select * from passport_log where ppid = $ppid order by login_time desc";
		$rs = n_api('mysql')->cname('weixin')->fetchFirst($query);
		return $rs;
	}
	
}